function set (name, value = '', time = 0, type) {
    time = isNaN(time - 0) ? 0 : time - 0 // 转换成数字,字符串类型的数字也转成数字
    time = time > 0 ? time : 0 // 有负数的情况
    let obj = {}
    obj['prefix_' + 'value'] = value
    obj['prefix_' + 'time'] = time
    obj['prefix_' + 'startTime'] = new Date().getTime() // 记录何时将值存入缓存，毫秒级
  
    if (name) {
      type.setItem(name, JSON.stringify(obj))
    } else {
      console.log('请先设置name名')
    }
  }
  
  function get (name, type) {
    let item = type.getItem(name)
    if (item) {
      // 先尝试进行json字符串转为对象,可能有直接存储字符串的情况
      try {
        item = JSON.parse(item)
      } catch (error) {
        // 如果不行就不是json的字符串，就直接返回
        // item = item
      }
      //  判断有没有设置过期时间、保存数据的格式
      // 先判断设置时的时间大于0，是否为数字,过期时间是否也为数字
      if ((item['prefix_' + 'startTime'] > 0) && (!isNaN(item['prefix_' + 'startTime'])) && (!isNaN(item['prefix_' + 'time']))) {
        let date = new Date().getTime() // 获取当前时间
        if (item['prefix_' + 'time'] === 0) { // 等于0永不过期
          return item['prefix_' + 'value']
        } else if (item['prefix_' + 'time'] + item['prefix_' + 'startTime'] > date) { // 开始时间+保存时间如果大于当前时间,（未过期）就返回值，否则清空
          return item['prefix_' + 'value']
        } else {
          type.removeItem(name)
          return null
        }
      } else {
        // 如果没有设置失效时间，直接返回值
        return item
      }
    } else {
      return null
    }
  }
  
  function remove (name, type) {
    if (name) { // 有参数清除单条数据
      type.removeItem(name)
    } else { // 无参数清除所有缓存数据
      type.clear()
    }
  }
  
  function key (num, type) {
    num = isNaN(num - 0) ? -1 : parseInt(num - 0) // 转换成数字,字符串类型的数字也转成数字，同时取整
    if (num >= 0) {
      return type.key(num)
    } else {
      return null
    }
  }
  
  let lStorage = {
    set: (name, value, time = 0) => {
      set(name, value, time = 0, localStorage)
    },
    get: (name) => {
      return get(name, localStorage)
    },
    remove: (name) => {
      remove(name, localStorage)
    },
    key: (num) => {
      return key(num, localStorage)
    }
  }
  let sStorage = {
    set: (name, value, time = 0) => {
      set(name, value, time = 0, sessionStorage)
    },
    get: (name) => {
      return get(name, sessionStorage)
    },
    remove: (name) => {
      remove(name, sessionStorage)
    },
    key: (num) => {
      return key(num, sessionStorage)
    }
  }
  
  export {
    lStorage,
    sStorage
  }
  